﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Configuration;
using System.Reflection;
using System.Diagnostics;
using System.IO;

/* 
 ****** OBSERVAÇÃO IMPORTANTE ******
 * 
 * Para executar este exemplo corretamente, é necessário executar o programa ProtectionConsole.exe
 * em modo administrador.
 * 
 * Não fiz um teste, mas li que a execução em modo debug pode não levar aos mesmos resultados que
 * a execução por fora do modo debug
 * 
 */


namespace ProtectionConsole
{
    class Program
    {
        static void Main(string[] args)
        {
            try
            {
                // método para proteger a seção de connection strings
                ProtectSection();
                
                // método para desproteger a seção de connection strings
                //UnProtectSection();

                // Observe que em ambos os casos (seção protegida ou não) a leitura do conteúdo do
                // arquivo app.config é feita exatamente da mesma forma.

                LerConnectionString();
            }
            catch (Exception ex)
            {
                Console.Error.WriteLine(ex);
            }

            Console.ReadLine();
        }
        
        static void ProtectSection()
        {
            Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
            ConfigurationSection section = config.GetSection("connectionStrings");
            
            if ((section != null) && (!section.SectionInformation.IsProtected))
            {
                section.SectionInformation.ProtectSection("RSAProtectedConfigurationProvider");
                config.Save();
            }
        }

        static void UnProtectSection()
        {
            Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
            ConfigurationSection section = config.GetSection("connectionStrings");

            if ((section != null) && (section.SectionInformation.IsProtected))
            {
                section.SectionInformation.UnprotectSection();
                config.Save();
            }
        }

        static void LerConnectionString()
        {
            foreach(ConnectionStringSettings connStr in ConfigurationManager.ConnectionStrings)
                Console.WriteLine(connStr.ConnectionString);
        }
    }
}
